<!DOCTYPE html>
<!-- saved from url=(0050)file:///C:/Users/Administrator/Desktop/report.html -->
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

    <title>测试报告</title>
    <style>body {
        font-family: Helvetica, Arial, sans-serif;
        font-size: 12px;
        min-width: 1200px;
        color: #999;
    }

    h1 {
        font-size: 24px;
        color: black;
    }

    h2 {
        font-size: 16px;
        color: black;
    }

    p {
        color: black;
    }

    a {
        color: #999;
    }

    table {
        border-collapse: collapse;
    }

    /******************************
     * SUMMARY INFORMATION
     ******************************/

    #environment td {
        padding: 5px;
        border: 1px solid #E6E6E6;
    }

    #environment tr:nth-child(odd) {
        background-color: #f6f6f6;
    }

    /******************************
     * TEST RESULT COLORS
     ******************************/
    span.passed, .passed .col-result {
        color: green;
    }

    span.skipped, span.xfailed, span.rerun, .skipped .col-result, .xfailed .col-result, .rerun .col-result {
        color: orange;
    }

    span.error, span.failed, span.xpassed, .error .col-result, .failed .col-result, .xpassed .col-result {
        color: red;
    }

    /******************************
     * RESULTS TABLE
     *
     * 1. Table Layout
     * 2. Extra
     * 3. Sorting items
     *
     ******************************/

    /*------------------
     * 1. Table Layout
     *------------------*/

    #results-table {
        border: 1px solid #e6e6e6;
        color: #999;
        font-size: 12px;
        width: 100%
    }

    #results-table th, #results-table td {
        padding: 5px;
        border: 1px solid #E6E6E6;
        text-align: left
    }

    #results-table th {
        font-weight: bold
    }

    /*------------------
     * 2. Extra
     *------------------*/

    .log:only-child {
        height: inherit
    }

    .log {
        background-color: #e6e6e6;
        border: 1px solid #e6e6e6;
        color: black;
        display: block;
        font-family: "Courier New", Courier, monospace;
        height: 230px;
        overflow-y: scroll;
        padding: 5px;
        white-space: pre-wrap
    }

    div.image {
        border: 1px solid #e6e6e6;
        float: right;
        height: 240px;
        margin-left: 5px;
        overflow: hidden;
        width: 320px
    }

    div.image img {
        width: 320px
    }

    .collapsed {
        display: none;
    }

    .expander::after {
        content: " (show details)";
        color: #BBB;
        font-style: italic;
        cursor: pointer;
    }

    .collapser::after {
        content: " (hide details)";
        color: #BBB;
        font-style: italic;
        cursor: pointer;
    }

    /*------------------
     * 3. Sorting items
     *------------------*/
    .sortable {
        cursor: pointer;
    }

    .sort-icon {
        font-size: 0px;
        float: left;
        margin-right: 5px;
        margin-top: 5px;
        /*triangle*/
        width: 0;
        height: 0;
        border-left: 8px solid transparent;
        border-right: 8px solid transparent;
    }

    .inactive .sort-icon {
        /*finish triangle*/
        border-top: 8px solid #E6E6E6;
    }

    .asc.active .sort-icon {
        /*finish triangle*/
        border-bottom: 8px solid #999;
    }

    .desc.active .sort-icon {
        /*finish triangle*/
        border-top: 8px solid #999;
    }
    </style>
</head>
<body onload="init()">
<script>/* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this file,
 * You can obtain one at http://mozilla.org/MPL/2.0/. */


function toArray(iter) {
    if (iter === null) {
        return null;
    }
    return Array.prototype.slice.call(iter);
}

function find(selector, elem) {
    if (!elem) {
        elem = document;
    }
    return elem.querySelector(selector);
}

function find_all(selector, elem) {
    if (!elem) {
        elem = document;
    }
    return toArray(elem.querySelectorAll(selector));
}

function sort_column(elem) {
    toggle_sort_states(elem);
    var colIndex = toArray(elem.parentNode.childNodes).indexOf(elem);
    var key;
    if (elem.classList.contains('numeric')) {
        key = key_num;
    } else if (elem.classList.contains('result')) {
        key = key_result;
    } else {
        key = key_alpha;
    }
    sort_table(elem, key(colIndex));
}

function show_all_extras() {
    find_all('.col-result').forEach(show_extras);
}

function hide_all_extras() {
    find_all('.col-result').forEach(hide_extras);
}

function show_extras(colresult_elem) {
    var extras = colresult_elem.parentNode.nextElementSibling;
    var expandcollapse = colresult_elem.firstElementChild;
    extras.classList.remove("collapsed");
    expandcollapse.classList.remove("expander");
    expandcollapse.classList.add("collapser");
}

function hide_extras(colresult_elem) {
    var extras = colresult_elem.parentNode.nextElementSibling;
    var expandcollapse = colresult_elem.firstElementChild;
    extras.classList.add("collapsed");
    expandcollapse.classList.remove("collapser");
    expandcollapse.classList.add("expander");
}

function show_filters() {
    var filter_items = document.getElementsByClassName('filter');
    for (var i = 0; i < filter_items.length; i++)
        filter_items[i].hidden = false;
}

function add_collapse() {
    // Add links for show/hide all
    var resulttable = find('table#results-table');
    var showhideall = document.createElement("p");

    resulttable.parentElement.insertBefore(showhideall, resulttable);

    // Add show/hide link to each result
    find_all('.col-result').forEach(function (elem) {
        var collapsed = get_query_parameter('collapsed') || 'Passed';
        var extras = elem.parentNode.nextElementSibling;
        var expandcollapse = document.createElement("span");
        if (collapsed.includes(elem.innerHTML)) {
            extras.classList.add("collapsed");
            expandcollapse.classList.add("expander");
        } else {
            expandcollapse.classList.add("collapser");
        }
        elem.appendChild(expandcollapse);

        elem.addEventListener("click", function (event) {
            if (event.currentTarget.parentNode.nextElementSibling.classList.contains("collapsed")) {
                show_extras(event.currentTarget);
            } else {
                hide_extras(event.currentTarget);
            }
        });
    })
}

function get_query_parameter(name) {
    var match = RegExp('[?&]' + name + '=([^&]*)').exec(window.location.search);
    return match && decodeURIComponent(match[1].replace(/\+/g, ' '));
}

function init() {
    reset_sort_headers();

    add_collapse();

    show_filters();

    toggle_sort_states(find('.initial-sort'));

    find_all('.sortable').forEach(function (elem) {
        elem.addEventListener("click",
            function (event) {
                sort_column(elem);
            }, false)
    });

}
;

function sort_table(clicked, key_func) {
    var rows = find_all('.results-table-row');
    var reversed = !clicked.classList.contains('asc');
    var sorted_rows = sort(rows, key_func, reversed);
    /* Whole table is removed here because browsers acts much slower
     * when appending existing elements.
     */
    var thead = document.getElementById("results-table-head");
    document.getElementById('results-table').remove();
    var parent = document.createElement("table");
    parent.id = "results-table";
    parent.appendChild(thead);
    sorted_rows.forEach(function (elem) {
        parent.appendChild(elem);
    });
    document.getElementsByTagName("BODY")[0].appendChild(parent);
}

function sort(items, key_func, reversed) {
    var sort_array = items.map(function (item, i) {
        return [key_func(item), i];
    });
    var multiplier = reversed ? -1 : 1;

    sort_array.sort(function (a, b) {
        var key_a = a[0];
        var key_b = b[0];
        return multiplier * (key_a >= key_b ? 1 : -1);
    });

    return sort_array.map(function (item) {
        var index = item[1];
        return items[index];
    });
}

function key_alpha(col_index) {
    return function (elem) {
        return elem.childNodes[1].childNodes[col_index].firstChild.data.toLowerCase();
    };
}

function key_num(col_index) {
    return function (elem) {
        return parseFloat(elem.childNodes[1].childNodes[col_index].firstChild.data);
    };
}

function key_result(col_index) {
    return function (elem) {
        var strings = ['Error', 'Failed', 'Rerun', 'XFailed', 'XPassed',
            'Skipped', 'Passed'];
        return strings.indexOf(elem.childNodes[1].childNodes[col_index].firstChild.data);
    };
}

function reset_sort_headers() {
    find_all('.sort-icon').forEach(function (elem) {
        elem.parentNode.removeChild(elem);
    });
    find_all('.sortable').forEach(function (elem) {
        var icon = document.createElement("div");
        icon.className = "sort-icon";
        icon.textContent = "vvv";
        elem.insertBefore(icon, elem.firstChild);
        elem.classList.remove("desc", "active");
        elem.classList.add("asc", "inactive");
    });
}

function toggle_sort_states(elem) {
    //if active, toggle between asc and desc
    if (elem.classList.contains('active')) {
        elem.classList.toggle('asc');
        elem.classList.toggle('desc');
    }

    //if inactive, reset all other functions and add ascending active
    if (elem.classList.contains('inactive')) {
        reset_sort_headers();
        elem.classList.remove('inactive');
        elem.classList.add('active');
    }
}

function is_all_rows_hidden(value) {
    return value.hidden == false;
}

function filter_table(elem) {
    var outcome_att = "data-test-result";
    var outcome = elem.getAttribute(outcome_att);
    class_outcome = outcome + " results-table-row";
    var outcome_rows = document.getElementsByClassName(class_outcome);

    for (var i = 0; i < outcome_rows.length; i++) {
        outcome_rows[i].hidden = !elem.checked;
    }

    var rows = find_all('.results-table-row').filter(is_all_rows_hidden);
    var all_rows_hidden = rows.length == 0 ? true : false;
    var not_found_message = document.getElementById("not-found-message");
    not_found_message.hidden = !all_rows_hidden;
}
</script>
<h1>{{ test_suit_name }}测试报告.html</h1>
<p>{{ start_time }} 由 <a href="https://pypi.python.org/pypi/pytest-html">pytest-html</a> v1.20.0</p>


<h2>总结</h2>
<p>{{ total_count }} 个测试在 {{ take_time }} 秒内运行 </p>
<p class="filter">（取消）选中复选框以过滤结果.</p><input checked="true" class="filter" data-test-result="passed"
                                            name="filter_checkbox" onchange="filter_table(this)" type="checkbox"><span
        class="passed">{{pass_count}} 通过</span>, <input checked="true" class="filter" data-test-result="skipped" disabled="true"
                                           name="filter_checkbox" onchange="filter_table(this)" type="checkbox"><span
        class="skipped">0 跳过</span>, <input checked="true" class="filter" data-test-result="failed"
                                            name="filter_checkbox" onchange="filter_table(this)" type="checkbox"><span
        class="failed">{{fail_count}} 失败</span>, <input checked="true" class="filter" data-test-result="error" disabled="true"
                                           name="filter_checkbox" onchange="filter_table(this)" type="checkbox"><span
        class="error">0 错误</span>, ,
<h2>结果</h2>
<p><a href="javascript:show_all_extras()">显示所有细节</a> / <a href="javascript:hide_all_extras()">隐藏所有细节</a></p>
<table id="results-table">
    <thead id="results-table-head">
    <tr>
        <th class="sortable result initial-sort asc active" col="result">
            <div class="sort-icon">vvv</div>
            结果
        </th>
        <th class="sortable asc inactive" col="name">
            <div class="sort-icon">vvv</div>
            案例名称
        </th>
        <th class="sortable numeric asc inactive" col="duration">
            <div class="sort-icon">vvv</div>
            持续时间
        </th>
        <th>链接</th>
    </tr>
    <tr hidden="true" id="not-found-message">
        <th colspan="4">没有找到结果. Try to check the filters</th>
    </tr>
    </thead>
    {% for case in case_results %}
        {% if case.result_status == "pass" %}
            <tbody class="passed results-table-row">
            <tr>
                <td class="col-result">通过<span class="expander"></span></td>
                <td class="col-name">{{ case.test_case_name }}</td>
                <td class="col-duration">{{ case.take_time }}</td>
                <td class="col-links"></td>
            </tr>
            <tr class="collapsed">
                <td class="extra" colspan="4">
                    <div class="log">{{ case.log_text }}</div>
                </td>
            </tr>
            </tbody>

        {% elif case.result_status == "fail" %}
            <tbody class="failed results-table-row">
            <tr>
                <td class="col-result">失败<span class="expander"></span></td>
                <td class="col-name">{{ case.test_case_name }}</td>
                <td class="col-duration">{{ case.take_time }}</td>
                <td class="col-links"></td>
            </tr>
            <tr class="collapsed">
                <td class="extra" colspan="4">
                    <div class="log">{{ case.log_text }}</div>
                </td>
            </tr>
            </tbody>

        {% endif %}

    {% endfor %}
</table>
</body>
</html>